package com.ossfk.jt808.pojo.req;

import java.util.Arrays;

import com.ossfk.jt808.constant.Jt808Constants;
import com.ossfk.jt808.pojo.Jt808Msg;
import com.ossfk.jt808.pojo.info.Jt808TerminalRegistInfo;
import com.ossfk.jt808.utils.Jt808Utils;
import com.ossfk.net.session.TcpSession;
import com.ossfk.net.utils.ByteHelper;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * @ClassName: Jt808TerminalRegistReq
 * @Description: 终端注册请求
 * @author Liujiefu
 * @date 2020-03-16 15:54:23
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class Jt808TerminalRegistReq extends Jt808Msg {
	private static final long serialVersionUID = 4695905557399462069L;
	private Jt808TerminalRegistInfo terminalRegInfo;

	public Jt808TerminalRegistReq(TcpSession session) {
		super(session, Jt808Constants.MSG_ID_TERMINAL_REGISTER);
	}

	public Jt808TerminalRegistReq(Jt808Msg packageData) {
		this.session = packageData.getSession();
		this.checkSum = packageData.getCheckSum();
		this.msgBodyBytes = packageData.getMsgBodyBytes();
		this.header = packageData.getHeader();
		this.msgBytes = packageData.getMsgBytes();
		decodeBody();
	}

	@Override
	public byte[] getMsgBodyBytes() {
		if (msgBodyBytes == null)
			encodeBody();
		return msgBodyBytes;
	}

	private void decodeBody() {
		if (getMsgBodyBytes() == null)
			return;
		terminalRegInfo = new Jt808TerminalRegistInfo();
		// 1. byte[0-1] 省域ID(WORD)
		// 设备安装车辆所在的省域，省域ID采用GB/T2260中规定的行政区划代码6位中前两位
		// 0保留，由平台取默认值
		terminalRegInfo.setProvinceId(ByteHelper.byteToInteger(msgBodyBytes, 0, 2));

		// 2. byte[2-3] 设备安装车辆所在的市域或县域,市县域ID采用GB/T2260中规定的行 政区划代码6位中后四位
		// 0保留，由平台取默认值
		terminalRegInfo.setCityId(ByteHelper.byteToInteger(msgBodyBytes, 2, 2));

		// 3. byte[4-8] 制造商ID(BYTE[5]) 5 个字节，终端制造商编码
		// byte[] tmp = new byte[5];
		terminalRegInfo.setManufacturerId(Jt808Utils.bytesToString(msgBodyBytes, 4, 5));

		// 4. byte[9-16] 终端型号(BYTE[8]) 八个字节， 此终端型号 由制造商自行定义 位数不足八位的，补空格。
		terminalRegInfo.setTerminalType(Jt808Utils.bytesToString(msgBodyBytes, 9, 8));

		// 5. byte[17-23] 终端ID(BYTE[7]) 七个字节， 由大写字母 和数字组成， 此终端 ID由制造 商自行定义
		terminalRegInfo.setTerminalId(Jt808Utils.bytesToString(msgBodyBytes, 17, 7));

		// 6. byte[24] 车牌颜色(BYTE) 车牌颜 色按照JT/T415-2006 中5.4.12 的规定
		terminalRegInfo.setLicensePlateColor(ByteHelper.byteToInteger(msgBodyBytes, 24, 1));

		// 7. byte[25-x] 车牌(STRING) 公安交 通管理部门颁 发的机动车号牌
		terminalRegInfo.setLicensePlate(Jt808Utils.bytesToString(msgBodyBytes, 25, msgBodyBytes.length - 25));

	}

	private byte[] encodeBody() {
		if (terminalRegInfo == null)
			return null;
		byte[] manufacturerIdBytes = terminalRegInfo.getManufacturerId().getBytes(Jt808Constants.STRING_CHARSET);
		byte[] terminalTypeBytes = terminalRegInfo.getTerminalType().getBytes(Jt808Constants.STRING_CHARSET);
		byte[] terminalIdBytes = terminalRegInfo.getTerminalId().getBytes(Jt808Constants.STRING_CHARSET);
		byte[] licensePlateBytes = terminalRegInfo.getLicensePlate().getBytes(Jt808Constants.STRING_CHARSET);
		this.msgBodyBytes = ByteHelper.concatAll(Arrays.asList(
				ByteHelper.integerTo2Bytes(terminalRegInfo.getProvinceId()),
				ByteHelper.integerTo2Bytes(terminalRegInfo.getCityId()),
				ByteHelper.rightPad(manufacturerIdBytes, 5, (byte) 0x00),
				// 808补充协议为20字节
				ByteHelper.rightPad(terminalTypeBytes, 8, (byte) 0x00),
				ByteHelper.rightPad(terminalIdBytes, 7, (byte) 0x00),
				new byte[] { ByteHelper.integerTo1Byte(terminalRegInfo.getLicensePlateColor()) }, licensePlateBytes));
		return this.msgBodyBytes;
	}
}
